package delphorm.web.controller;


import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.propertyeditors.CustomNumberEditor;
import org.springframework.validation.BindException;
import org.springframework.web.bind.ServletRequestDataBinder;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.support.ByteArrayMultipartFileEditor;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.SimpleFormController;

import delphorm.entite.questionnaire.Question;
import delphorm.entite.questionnaire.Questionnaire;
import delphorm.entite.questionnaire.Reponse;
import delphorm.web.forms.ReponseFormulaire;


public class AjouterReponseSession extends SimpleFormController {
	private Question question;
	private Integer numeroReponse;
	private Boolean nouvelleReponse;
	
	public Boolean getNouvelleReponse() {
		return nouvelleReponse;
	}



	public void setNouvelleReponse(Boolean nouvelleReponse) {
		this.nouvelleReponse = nouvelleReponse;
	}


	/* cette méthode permet de récupérer un formulaire déjà rempli*/
	protected Object formBackingObject(HttpServletRequest request)
	{
		//récupère le formulaire dans la session
		Object formulaire = request.getSession().getAttribute("formulaire");
		
		if(formulaire == null)
		{
			//récupère le questionnaire
			Questionnaire questionnaire = (Questionnaire)request.getSession().getAttribute("questionnaire");
			
			//récupère la question
			String numeroQ = request.getParameter("numeroquestion");
			Integer numeroQuestion = new Integer(Integer.parseInt(numeroQ));
			setQuestion((Question)questionnaire.getQuestions().get(numeroQuestion.intValue()));
			
			String numeroR = request.getParameter("numeroreponse");
			
			if(numeroR == null)
				//c'est une nouvelle réponse
			{
//				spécifie qu'on ajoute une nouvell réponse
				setNouvelleReponse(new Boolean(true));
				
				//l'objet formulaire est un nouvel objet
				formulaire = new ReponseFormulaire();
				
			}
			else
			{ 	//c'est pour modifier une réponse
				
//				spécifie qu'on modifie une réponsemodifie
				setNouvelleReponse(new Boolean(false));
				
				//enregistre le numéro de la réponse
				setNumeroReponse(new Integer(Integer.parseInt(numeroR)));
				//récupère la réponse
				Reponse reponse = (Reponse)getQuestion().getReponses().get(getNumeroReponse().intValue());
				//TODO exception si null
				
				//l'objet formulaire est la réponse chargée
				ReponseFormulaire reponseFormulaire= new ReponseFormulaire(reponse);
				formulaire = reponseFormulaire;
				
				
			}
			
		}
		return formulaire;
	}
	
	

	protected void initBinder(HttpServletRequest req, ServletRequestDataBinder binder) throws Exception {
		// TODO Auto-generated method stub
		super.initBinder(req, binder);
		binder.registerCustomEditor(Double.class,new CustomNumberEditor(Double.class,true));
		binder.registerCustomEditor(byte[].class, new ByteArrayMultipartFileEditor());
	}



	//cette méthode permet d'obtenir l'objet formulaire dans la page de confirmation
	protected ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response, Object reponseform, BindException errors)
	{			
		ReponseFormulaire reponseForm = (ReponseFormulaire)reponseform;
		//convertit le formulaire en objet métier
		Reponse reponse = reponseForm.toReponseMetier();
		
		//récupère la question de la réponse
		Question question = getQuestion();
		if(getNouvelleReponse().booleanValue() == true)
			//ajoute la réponse à la question courante
			question.getReponses().add(reponse);
		else
			//remplace la réponse
			question.getReponses().set(getNumeroReponse().intValue(), reponse);
		
		//ajoute la réponse courante dans la session
		request.getSession().setAttribute("reponse",reponse);
		
		//rendre le model and view
		//pas de modele (l'utilisateur est déjà dans la session)
		return new ModelAndView(getSuccessView(),null);
	}



	protected void onBind(HttpServletRequest request, Object formulaire) throws Exception {
		// TODO Auto-generated method stub
		super.onBind(request, formulaire);
		//Récupère le nom du fichier
		MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
//		 on récupère une référence sur le fichier chargé
		MultipartFile fichier = multipartRequest.getFile("fichier");
		ReponseFormulaire repForm =(ReponseFormulaire)formulaire;
		String filename = fichier.getOriginalFilename();
		repForm.setFilename(filename);
	}



	public Integer getNumeroReponse() {
		return numeroReponse;
	}



	public void setNumeroReponse(Integer numeroReponse) {
		this.numeroReponse = numeroReponse;
	}



	public Question getQuestion() {
		return question;
	}



	public void setQuestion(Question question) {
		this.question = question;
	}
}
